home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 142 / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z / Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin / tools / s44play / s44p101s.lzh / scsicmd.s < prev    next >
Text File  |  1999-12-19  |  9KB  |  372 lines

  1.     .include    iocscall.mac
  2.     .include    global.mac
  3.  
  4. ;----------------------------------------------------------------
  5. ;SCSIコマンド発行
  6. ;<(4,sp).l:CDBの長さ(バイト)
  7. ;<(8,sp).l:CDBの先頭アドレス
  8. ;<(12,sp).l:読み込みバッファの長さ
  9. ;<(16,sp).l:読み込みバッファの先頭アドレス
  10. ;>d0.l:下位ワード=_S_STSINの結果,上位ワード=_S_MSGINの結果,負数=エラー
  11. ;>n-flag:mi=エラー
  12.     .offset    -4
  13. frmsiz:
  14. msgsts:
  15.     .ds.b    1
  16. msg:    .ds.b    1
  17.     .ds.b    1
  18. sts:    .ds.b    1
  19. _a6:    .ds.l    1
  20. _pc:    .ds.l    1
  21. cdblen:    .ds.l    1
  22. cdbptr:    .ds.l    1
  23. buflen:    .ds.l    1
  24. bufptr:    .ds.l    1
  25.     .text
  26.     .align    4,$2048
  27. scsicmd::
  28.     link    a6,#frmsiz
  29.     movem.l    d1-d4/d6-d7/a1,-(sp)
  30. ;    bsr    super
  31.     bsr    scsi_hard_soft_on
  32.     st.b    scsicmd_in_progress
  33.  
  34.     clr.b    scsicmd_error_retry
  35.     moveq.l    #SCSI_READ_RETRY_COUNT-1,d7
  36. 7:
  37.     move.l    scsiid,d4        ;lun,id
  38.     moveq.l    #_S_SELECT,d6
  39.     SCSI    _S_SELECT
  40.     tst.l    d0
  41.     bne    89f            ;0以外なら異常終了
  42.  
  43.     movea.l    (cdbptr,a6),a1
  44.     move.w    scsiid,d0        ;lun
  45.     lsl.b    #5,d0
  46.     andi.b    #$1F,(1,a1)
  47.     or.b    d0,(1,a1)
  48.     move.l    (cdblen,a6),d3
  49.     move.l    scsiid,d4        ;lun,id
  50.     moveq.l    #_S_CMDOUT,d6
  51.     SCSI    _S_CMDOUT
  52.     tst.l    d0
  53.     bmi    89f            ;0でなくてもよい
  54.  
  55.     move.l    (buflen,a6),d3
  56.     beq    3f
  57.     movea.l    (bufptr,a6),a1
  58.     tst.b    hard_soft
  59.     bgt    1f            ;設定がなければ_S_DATAINを使う
  60.     moveq.l    #_S_DATAIN,d6
  61.     SCSI    _S_DATAIN        ;ハード転送
  62.     bra    2f
  63. 1:    moveq.l    #_S_DATAIN_P,d6
  64.     SCSI    _S_DATAIN_P        ;ソフト転送
  65. 2:    tst.l    d0
  66.     bmi    89f            ;0でなくてもよい
  67. 3:
  68.  
  69.     clr.l    (msgsts,a6)
  70.     lea.l    (sts,a6),a1
  71.     moveq.l    #_S_STSIN,d6
  72.     SCSI    _S_STSIN
  73.     tst.l    d0
  74.     bne    89f
  75.     lea.l    (msg,a6),a1
  76.     moveq.l    #_S_MSGIN,d6
  77.     SCSI    _S_MSGIN
  78.     tst.l    d0
  79.     bne    89f
  80.     move.l    (msgsts,a6),d1
  81.     moveq.l    #-1,d6
  82.     bsr    scsistssns        ;ステータスバイトとセンスキーをチェック
  83.     beq    99f
  84.     bmi    89f
  85.     addq.b    #1,scsicmd_error_retry
  86.     dbra    d7,7b            ;リトライする
  87.  
  88.     moveq.l    #-2,d6
  89.  
  90. 89:    move.b    d6,scsicmd_error_call
  91.     move.l    d0,scsicmd_error_d0
  92.     moveq.l    #-1,d1
  93.  
  94. 99:    sf.b    scsicmd_in_progress
  95.     bsr    scsi_hard_soft_off
  96. ;    bsr    user
  97.     move.l    d1,d0
  98.     movem.l    (sp)+,d1-d4/d6-d7/a1
  99.     unlk    a6
  100.     rts
  101.  
  102.     .data
  103. scsicmd_in_progress::    .dc.b    0    ;-1=SCSI転送処理中
  104. scsicmd_error_retry:    .dc.b    0
  105. scsicmd_error_call::    .dc.b    0    ;-1=エラー(リトライ可),-2=エラー(リトライ不可)
  106.     .align    4
  107. scsicmd_error_d0:    .dc.l    0
  108. scsiid::        .dc.l    -1    ;lun,id
  109.  
  110. ;----------------------------------------------------------------
  111. ;_S_MODESELECT実行
  112. ;<d3.l:CDBの長さ(バイト)
  113. ;<a1.l:CDBの先頭アドレス
  114. ;>d0.l:下位ワード=_S_STSINの結果,上位ワード=_S_MSGINの結果,負数=エラー
  115. ;>n-flag:mi=エラー
  116.     .text
  117.     .align    4,$2048
  118. modeselect::
  119.     movem.l    d1-d4/d6-d7/a1,-(sp)
  120. ;    bsr    super
  121.     bsr    scsi_hard_soft_on
  122.     st.b    scsicmd_in_progress
  123.  
  124.     clr.b    scsicmd_error_retry
  125.     moveq.l    #MODESELECT_RETRY_COUNT-1,d7
  126. 7:
  127.     moveq.l    #$10,d2            ;PF=1(ページフォーマット),SP=0(セーブページなし)
  128.     move.l    (4*2,sp),d3        ;スタックオフセット注意
  129.     move.l    scsiid,d4        ;lun,id
  130.     movea.l    (4*6,sp),a1        ;スタックオフセット注意
  131.     moveq.l    #_S_MODESELECT,d6
  132.     SCSI    _S_MODESELECT
  133.     move.l    d0,d1
  134.     bmi    89f
  135.     moveq.l    #-1,d6
  136.     bsr    scsistssns        ;ステータスバイトとセンスキーをチェック
  137.     beq    99f
  138.     bmi    89f
  139.     addq.b    #1,scsicmd_error_retry
  140.     dbra    d7,7b            ;リトライする
  141.  
  142.     moveq.l    #-2,d6
  143.  
  144. 89:    move.b    d6,scsicmd_error_call
  145.     move.l    d0,scsicmd_error_d0
  146.     moveq.l    #-1,d1
  147.  
  148. 99:    sf.b    scsicmd_in_progress
  149.     bsr    scsi_hard_soft_off
  150. ;    bsr    user
  151.     move.l    d1,d0
  152.     movem.l    (sp)+,d1-d4/d6-d7/a1
  153.     rts
  154.  
  155. ;----------------------------------------------------------------
  156. ;SCSIコマンドの後処理
  157. ;    ステータスバイトを解析してエラーやリトライの判定を行う
  158. ;<d1.l:下位ワード=_S_STSINの結果,上位ワード=_S_MSGINの結果,負数=エラー
  159. ;>d0.l:0=正常終了,1=エラー(リトライ可),-1=エラー(リトライ不可)
  160. ;>z-flag:eq=正常終了,ne=エラー
  161. ;>n-flag:(ne)pl=リトライ可,mi=リトライ不可
  162.     .text
  163.     .align    4,$2048
  164. scsistssns::
  165.     movem.l    d1-d4/a1,-(sp)
  166.     lea.l    (-256,sp),sp
  167.     moveq.l    #$3E,d0
  168.     and.b    d1,d0            ;ステータスバイト
  169.     move.b    d0,scsicmd_error_sts
  170. ;        $00    Good → 正常終了
  171. ;        $02    Check Condition → Request Senseを発行しなければならない
  172. ;        $04    Condition Met
  173. ;        $08    Busy → リトライ
  174. ;        $10    Intermediate
  175. ;        $14    Intermediate-Condition Met
  176. ;        $18    Reservation Conflict
  177. ;        $22    Command Terminated
  178. ;        $28    Queue Full
  179. ;        その他 → エラー
  180.     beq    8f            ;$00 → 正常終了
  181.     subq.b    #$02,d0
  182.     beq    1f            ;$02 → Request Sense
  183.     subq.b    #$08-$02,d0
  184.     beq    7f            ;$08 → リトライ
  185.     bra    6f
  186.  
  187. 1:    moveq.l    #26,d3
  188.     move.l    scsiid,d4        ;lun,id
  189.     movea.l    sp,a1
  190.     SCSI    _S_REQUEST
  191.     moveq.l    #$0F,d0
  192.     and.b    (2,sp),d0        ;センスキー
  193.     move.b    d0,scsicmd_error_sns
  194. ;        $0    No Sense → 正常終了
  195. ;        $1    Recovered Error → 正常終了
  196. ;        $2    Not Ready → リトライ
  197. ;        $3    Medium Error
  198. ;        $4    Hardware Error
  199. ;        $5    Illegal Request
  200. ;        $6    Unit Attention → リトライ
  201. ;        $7    Data Protect
  202. ;        $8    Blank Check
  203. ;        $9    (ベンダ固有)
  204. ;        $A    Copy Aborted
  205. ;        $B    Aborted Command → リトライ
  206. ;        $C    Equal
  207. ;        $D    Volume Overflow
  208. ;        $E    Miscompare
  209. ;        $F    (Reserved)
  210.  
  211. ;    cmp.b    #$3,d0            ;Medium Errorを無視してみる
  212. ;    beq    8f
  213.  
  214.     subq.b    #$2,d0
  215.     bcs    8f            ;$0,$1 → 正常終了
  216.     beq    7f            ;$2 → リトライ
  217.     subq.b    #$6-$2,d0
  218.     beq    7f            ;$6 → リトライ
  219.     subq.b    #$B-$6,d0
  220.     beq    7f            ;$B → リトライ
  221. 6:    moveq.l    #-1,d0
  222.     bra    9f
  223.  
  224. 7:    moveq.l    #1,d0
  225.     bra    9f
  226.  
  227. 8:    moveq.l    #0,d0
  228. 9:    lea.l    (256,sp),sp
  229.     movem.l    (sp)+,d1-d4/a1
  230.     rts
  231.  
  232.     .data
  233. scsicmd_error_sts::    .dc.b    0
  234. scsicmd_error_sns::    .dc.b    0
  235.  
  236. ;----------------------------------------------------------------
  237. ;SCSIコマンドのエラー状況を表示する
  238.     .text
  239.     .align    4,$2048
  240. print_scsicmd_error::
  241.     movem.l    d0/a0-a1,-(sp)
  242.     tst.b    scsicmd_error_call
  243.     beq    99f
  244.  
  245.     lea.l    (m_scsicmd_failed_by,pc),a0
  246.     bsr    eprint
  247.  
  248.     move.b    scsicmd_error_call,d0
  249.     cmp.b    #-1,d0
  250.     bne    1f
  251.     cmpi.b    #$02,scsicmd_error_sts
  252.     bne    2f
  253.                     ;Check Condition後のRequest Senseによるエラー
  254.     move.b    scsicmd_error_sns,d0
  255.     lea.l    (m_scsicmd_medium_error,pc),a0
  256.     subq.b    #$3,d0
  257.     beq    3f
  258.     lea.l    (m_scsicmd_hardware_error,pc),a0
  259.     subq.b    #$4-$3,d0
  260.     beq    3f
  261.     lea.l    (m_scsicmd_illegal_request,pc),a0
  262.     subq.b    #$5-$4,d0
  263.     beq    3f
  264.     lea.l    (m_scsicmd_check_condition,pc),a0
  265.     bsr    eprintcrlf
  266.     bsr    print_scsicmd_error_sns
  267.     bra    9f
  268.  
  269. 2:                    ;Check Condition以外のステータスによるエラー
  270.     lea.l    (m_scsicmd_error_status,pc),a0
  271.     bsr    eprintcrlf
  272.     bsr    print_scsicmd_error_sts
  273.     bra    9f
  274.  
  275. 1:    cmp.b    #-2,d0
  276.     bne    1f
  277.     lea.l    (m_scsicmd_status_busy,pc),a0
  278.     cmpi.b    #$02,scsicmd_error_sts
  279.     bne    3f            ;Busyによるリトライオーバーフロー
  280. 2:                    ;Check Condition後のリトライオーバーフロー
  281.     lea.l    (m_scsicmd_check_condition,pc),a0
  282.     bsr    eprint
  283.     move.b    scsicmd_error_sns,d0
  284.     lea.l    (m_scsicmd_not_ready,pc),a0
  285.     subq.b    #$2,d0
  286.     beq    3f            ;Not Readyによるリトライオーバーフロー
  287.     lea.l    (m_scsicmd_unit_attention,pc),a0
  288.     subq.b    #$6-$2,d0
  289.     beq    3f            ;Unit Attentionによるリトライオーバーフロー
  290.     lea.l    (m_scsicmd_aborted_command,pc),a0
  291. 3:    bsr    eprint
  292.     bra    9f
  293.  
  294. 1:    lea.l    (scsicmd_error_table,pc),a1
  295. 1:    cmp.b    (a1)+,d0
  296.     beq    2f
  297. @@:    tst.b    (a1)+
  298.     bne    @b
  299.     tst.b    (a1)
  300.     bne    1b
  301.     lea.l    (m_scsicmd_unknown_call,pc),a1    ;念のため
  302. 2:    lea.l    (m_scsicmd_call,pc),a0
  303.     bsr    eprint
  304.     movea.l    a1,a0
  305. 3:    bsr    eprint
  306.     lea.l    (m_scsicmd_failed,pc),a0
  307.     bsr    eprintcrlf
  308.     lea.l    (m_scsicmd_return_code,pc),a0
  309.     bsr    eprint
  310.     move.l    scsicmd_error_d0,d0
  311.     bsr    h8tos_eprint
  312.     bsr    ecrlf
  313.     lea.l    (m_scsicmd_retry_count,pc),a0
  314.     bsr    eprint
  315.     moveq.l    #0,d0
  316.     move.b    scsicmd_error_retry,d0
  317.     bsr    utos_eprint
  318. 7:    bsr    ecrlf
  319.     bsr    print_scsicmd_error_sts
  320. 8:    bsr    ecrlf
  321.     bsr    print_scsicmd_error_sns
  322. 9:    bsr    ecrlf
  323.  
  324.     sf.b    scsicmd_error_call
  325. 99:    movem.l    (sp)+,d0/a0-a1
  326.     rts
  327.  
  328. print_scsicmd_error_sts:
  329.     lea.l    (m_scsicmd_status_byte,pc),a0
  330.     bsr    eprint
  331.     moveq.l    #0,d0
  332.     move.b    scsicmd_error_sts,d0
  333.     bra    h2tos_eprint
  334.  
  335. print_scsicmd_error_sns:
  336.     lea.l    (m_scsicmd_sense_key,pc),a0
  337.     bsr    eprint
  338.     moveq.l    #0,d0
  339.     move.b    scsicmd_error_sns,d0
  340.     bra    h2tos_eprint
  341.  
  342. m_scsicmd_failed_by:        .dc.b    'SCSI operation failed by',0
  343. m_scsicmd_check_condition:    .dc.b    ' Check Condition',0
  344. m_scsicmd_error_status:        .dc.b    ' Error Status',0
  345. m_scsicmd_status_busy:        .dc.b    ' Busy Status',0
  346. m_scsicmd_not_ready:        .dc.b    ' Not Ready',0
  347. m_scsicmd_medium_error:        .dc.b    ' Medium Error',0
  348. m_scsicmd_hardware_error:    .dc.b    ' Hardware Error',0
  349. m_scsicmd_illegal_request:    .dc.b    ' Illegal Request',0
  350. m_scsicmd_unit_attention:    .dc.b    ' Unit Attention',0
  351. m_scsicmd_aborted_command:    .dc.b    ' Aborted Command',0
  352. m_scsicmd_unknown_call:        .dc.b    ' ???',0
  353. m_scsicmd_call:            .dc.b    ' ',0
  354. m_scsicmd_failed:        .dc.b    ' failed',0
  355. m_scsicmd_return_code:        .dc.b    ' Return Code: $',0
  356. m_scsicmd_retry_count:        .dc.b    ' Retry Count: ',0
  357. m_scsicmd_status_byte:        .dc.b    ' Status Byte: $',0
  358. m_scsicmd_sense_key:        .dc.b    '   Sense Key: $',0
  359.  
  360. scsicmd_error_table:
  361.     .dc.b    _S_SELECT,'_S_SELECT',0
  362.     .dc.b    _S_CMDOUT,'_S_CMDOUT',0
  363.     .dc.b    _S_DATAIN,'_S_DATAIN',0
  364.     .dc.b    _S_DATAIN_P,'_S_DATAIN_P',0
  365.     .dc.b    _S_STSIN,'_S_STSIN',0
  366.     .dc.b    _S_MSGIN,'_S_MSGIN',0
  367.     .dc.b    _S_MODESELECT,'_S_MODESELECT',0
  368.     .dc.b    _S_MODESENSE,'_S_MODESENSE',0
  369.     .dc.b    0
  370.     .even
  371.  
  372.